import cv2
import os
import time
from flask import Response
from apps.test import test_app

# 加载所有图片帧
def load_frames():
    frames = []
    folder = 'static/data'
    if not os.path.exists(folder):
        os.makedirs(folder)
    # 提取文件名中的数字部分，并按数字排序
    images = sorted(
        [f for f in os.listdir(folder) if f.startswith('frame_') and f.endswith('.jpg')],  # 过滤文件
        key=lambda x: int(x.split('_')[1].split('.')[0])  # 提取数字部分
    )
    for img_name in images:
        img_path = os.path.join(folder, img_name)
        frame = cv2.imread(img_path)
        if frame is not None:
            frames.append(frame)
    return frames


# 生成视频流的生成器函数
def generate_video_stream():
    frames = load_frames()
    fps = 24  # 设置帧率
    while True:  # 循环播放
        for frame in frames:
            # 将帧转换为JPEG格式
            ret, jpeg = cv2.imencode('.jpg', frame)
            if not ret:
                continue
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n')
            # 控制帧率
            time.sleep(1 / fps)



@test_app.route('/video')
def video_stream():
    print("video_stream")
    # 返回MJPEG流响应
    return Response(generate_video_stream(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')





@test_app.route('/live')
def live_stream():
    print("开始获取图片")
    # 确保static/data目录存在
    if not os.path.exists('static/data'):
        os.makedirs('static/data')
    if not os.path.exists('static/tmp_video'):
        os.makedirs('static/tmp_video')
    frame_count = 0
    processed_files = set()

    while True:
        # 遍历static/tmp_video目录中的所有.ts文件
        for ts_file in os.listdir('static/tmp_video'):
            if ts_file.endswith('.ts'):
                file_path = os.path.join('static/tmp_video', ts_file)
                # 获取文件的最后修改时间
                modified_time = os.path.getmtime(file_path)

                # 检查文件是否已经被处理过
                if file_path not in processed_files:
                    # 将文件路径和修改时间添加到已处理集合中
                    processed_files.add((file_path, modified_time))
                    # 创建一个VideoCapture对象
                    cap = cv2.VideoCapture(file_path)

                    while cap.isOpened():
                        ret, frame = cap.read()
                        if not ret:
                            break

                        # 保存每一帧为图片
                        cv2.imwrite(f'static/data/frame_{frame_count}.jpg', frame)
                        frame_count += 1

                    cap.release()

        # 等待一段时间再检查
        time.sleep(1)  # 每秒检查一次

    return "Video frames saved successfully!"



